package swimv2.ejb.control;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import swimv2.ejb.entity.Capacita;
import swimv2.ejb.entity.Lavoro;
import swimv2.ejb.entity.Notifica;
import swimv2.ejb.entity.Notifica.TipoDiNotifica;
import swimv2.ejb.entity.Utente;
import swimv2.ejb.remote.GestioneLavoroRemote;
import swimv2.ejb.util.Configurazione;
import swimv2.ejb.util.GestioneUtenti;


@Stateless(name="GestioneLavoro") 
public class GestioneLavoro implements GestioneLavoroRemote {
	@PersistenceContext(unitName="SWIMV2")
	private EntityManager entityManager;
	
	private Lavoro lavoro;

	public GestioneLavoro()
	{
		
	}

	
	@Override
	public void creaLavoro(String username, String descBreve, String DescEstesa,Set<Integer> requisiti,boolean soloAmici)
	{
		Lavoro l = new Lavoro();
		Utente u = GestioneUtenti.cercaUtente(entityManager, username);
		l.setDatore(u);
		l.setDescrizioneBreve(descBreve);
		l.setDescrizioneEstesa(DescEstesa);
		lavoro = l;
		
		impostaRequisiti(l,requisiti);
		l.setSoloAmici(soloAmici);
		entityManager.persist(l);
		
		return;
		
		
	}

	private void impostaRequisiti(Lavoro l, Set<Integer> requisitiInt)
	{
		//TODO trovare davvero la lista dei requisiti
		Set<Capacita>requisiti = new TreeSet<Capacita>();
		for(int id:requisitiInt)
		{
			Capacita c = entityManager.find(Capacita.class, id); 
			requisiti.add(c);
			
		}
		
		
		lavoro.setRequisiti(requisiti);
	}
	
	@Override
	public List<Lavoro> getLavoriCreati(String username)
	{
		Utente u = GestioneUtenti.cercaUtente(entityManager, username);
		return new ArrayList<Lavoro>(u.getLavoriOfferti());

	}

	@Override
	public List<Lavoro> getLavoriInOffertaDatore(String username)
	{
		Query query=entityManager.createQuery(" FROM Lavoro l WHERE l.stato='"+Lavoro.Stato.INOFFERTA.ordinal()+"' AND l.datore='"+username+"'");
		List<Lavoro> lavori=(List<Lavoro>)query.getResultList();
		return lavori;

	}
	@Override
	public List<Lavoro> getLavoriInCorsoDatore(String username)
	{
		Query query=entityManager.createQuery(" FROM Lavoro l WHERE l.stato='"+Lavoro.Stato.INCORSO.ordinal()+"' AND l.datore='"+username+"'");
		List<Lavoro> lavori=(List<Lavoro>)query.getResultList();
		return lavori;

	}
	@Override
	public List<Lavoro> getLavoriDaValutareDatore(String username)
	{
		Query query=entityManager.createQuery(" FROM Lavoro l WHERE l.stato='"+Lavoro.Stato.VAVALUTATO.ordinal()+"' AND l.datore='"+username+"'");
		List<Lavoro> lavori=(List<Lavoro>)query.getResultList();
		return lavori;

	}
	@Override
	public List<Lavoro> getLavoriConclusiDatore(String username)
	{
		Query query=entityManager.createQuery(" FROM Lavoro l WHERE l.stato='"+Lavoro.Stato.TERMINATO.ordinal()+"' AND l.datore='"+username+"'");
		List<Lavoro> lavori=(List<Lavoro>)query.getResultList();
		return lavori;

	}
	
	
	@Override
	public void proponiCandidatura(String username,Integer idLavoro)
	{
		Utente u = GestioneUtenti.cercaUtente(entityManager, username);
		Lavoro l = cercaLavoro(idLavoro);
		l.getCandidati().add(u);
	}

	@Override
	public void accettaCandidato(String datore,Integer idLavoro,String dipendente)
	{
		Utente dipendenteU = GestioneUtenti.cercaUtente(entityManager, dipendente);
		Lavoro l = cercaLavoro(idLavoro);
		l.setDipendente(dipendenteU);
		
		Notifica accettato = new Notifica(TipoDiNotifica.MESSAGGIODITESTO, "Hai preso il laoro", dipendenteU);
		dipendenteU.aggiungiNotifica(accettato);
		entityManager.persist(accettato);
		l.getCandidati().remove(dipendenteU);
		
		for (Utente utente:l.getCandidati())
		{
			//TODO  MESSAGGIOnon hai preso il lavoro
		}


		if(superatoLimiteLavori(dipendente))
		{
			for(Lavoro lav:dipendenteU.getCandidature())
				lav.getCandidati().remove(dipendenteU);
			//TODO messaggio ho cancellato le altre candidature
		}
		
		l.setStato(Lavoro.Stato.INCORSO);
		
	}
	
	private boolean superatoLimiteLavori(String username)
	{
		if (Configurazione.MAX_LAVORI_PER_DIPENDENTE <= 0)
			return false;
		int numLavori =  getPropriLavori(username).size();
		return numLavori >= Configurazione.MAX_LAVORI_PER_DIPENDENTE;
		
	}
	
	
	private Lavoro cercaLavoro(int id)
	{
		
		Lavoro lavoro = entityManager.find(Lavoro.class, id); 
		return lavoro;
	}
	

	
	@Override
	public List<Lavoro> getPropriLavori(String username)
	{
		Query query=entityManager.createQuery(" FROM Lavoro l WHERE l.stato='"+Lavoro.Stato.INCORSO.ordinal()+"' AND l.dipendente='"+username+"'");
		List<Lavoro> lavori=(List<Lavoro>)query.getResultList();
		return lavori;
		
	}
	@Override
	public void concludiLavoro(String username,int id)
	{
		Lavoro lavoro = entityManager.find(Lavoro.class, id); 
		lavoro.setStato(Lavoro.Stato.VAVALUTATO);

	}
	
	@Override 
	public List<Lavoro> getLavoriSvolti(String username)
	{
		Query query=entityManager.createQuery(" FROM Lavoro l WHERE (l.stato='"+Lavoro.Stato.TERMINATO.ordinal()+"' OR l.stato='"+Lavoro.Stato.VAVALUTATO.ordinal()+"') AND l.dipendente='"+username+"'");
		List<Lavoro> listaLavoriSvolti=(List<Lavoro>)query.getResultList();
		return listaLavoriSvolti;
		
	}
	
	@Override 
	public List<Lavoro> getRichiesteInviate(String username)
	{
		Utente u = GestioneUtenti.cercaUtente(entityManager, username);
		return new ArrayList<Lavoro>(u.getCandidature());
		
	}

	@Override
	public Lavoro findLavoro(int id)
	{
		Lavoro lavoro = entityManager.find(Lavoro.class, id);
		return lavoro;
	}

	@Override
	public void commentaLavoro(String commento, int id) {
		Lavoro lavoro = findLavoro(id);
		lavoro.setStato(Lavoro.Stato.TERMINATO);
		
	}
	
}
